#include<iostream>
using namespace std;
class A
{
public:
	virtual void Print(int x = 10)
	{
		cout << "A::x = " << x << endl;
	}
	virtual A* func()
	{
		cout << "A::func()" << endl;
		return this;
	}
protected:
	int _a = 1;
};
class B : public A
{
public:
	virtual void Print(int x = 20)
	{
		cout << "B::x = " << x << endl;
	}
	virtual B* func()
	{
		cout << "B::func()" << endl;
		return this;
	}
private:
	int _b = 2;
};
int main()
{
	A a;
	B b;
	return 0;
}
//#include<iostream>
//using namespace std;
//class Base1
//{
//public:
//	virtual Base1* func()
//	{
//		cout << "Base1::func()" << endl;
//		return this;
//	}
//protected:
//	int _b1 = 1;
//};
//class Base2
//{
//public:
//	virtual void Print(int x = 10)
//	{
//		cout << "Base2::Print()->x = " << x << endl;
//	}
//protected:
//	int _b2 = 2;
//};
//class Darive : public Base1 , public Base2
//{
//public:
//	virtual Darive* func()
//	{
//		cout << "Darive::func()" << endl;
//		return this;
//	}
//	virtual void Print(int x = 20)
//	{
//		cout << "Darive::Print()->x =" << x << endl;
//	}
//	virtual void Add(int x = 0, int y = 0)
//	{
//		cout << " x + y = " << x + y << endl;
//	}
//private:
//	int _d = 3;
//};
//int main()
//{
//	Base1 b1;
//	b1.func();
//	Base2 b2;
//	b2.Print();
//	Darive d;
//	d.func();
//	d.Print();
//	d.Add(1, 2);
//	cout << "------------------------------------------------------------------" << endl;
//
//	Base1* b3 = new Darive;
//	b3->func();
//	
//	b3 = &b1;
//	b3->func();
//	b3 = &d;
//	b3->func();
//
//	cout << "------------------------------------------------------------------" << endl;
//
//	Base2* b4 = new Darive;
//	b4->Print();
//
//	b4 = &b2;
//	b4->Print();
//	b4 = &d;
//	b4->Print();
//
//	cout << "------------------------------------------------------------------" << endl;
//
//	return 0;
//}